/***************************************************************************************
 * 本程序由Carter创建并免费开源共享
 * 你可以任意查看、使用和修改，并应用到自己的项目之中
 * 程序版权归Carter所有，任何人或组织不得将其据为己有
 *
 * 程序名称：				四轴无人机控制系统（无人机端）
 * 程序创建时间：			2025.04.19
 * 当前程序版本：			V1.0
 * 当前版本发布时间：		2025.04.19
 *
 * 项目地址网站：		https://gitee.com/fan-yiming
 *
 * 功能简介：
 * 1. 基于STM32的四轴无人机控制程序，支持MPU6050姿态传感器数据采集与滤波处理。
 * 2. 集成NRF24L01无线模块，实现遥控器与无人机之间的数据通信。
 * 3. 提供LED指示灯功能，便于调试与状态显示。
 * 4. 内置定时器中断，确保系统实时性。
 * 5. 油门摇杆拉低+长按KEY1 3秒解锁 长按KEY2 3秒退出紧急模式
 *
 * 使用说明：
 * - MPU6050支持校准模式，可通过定义`MPU6050_CALIBRATION`启用。
 * - 通过串口打印调试信息，便于开发与故障排查。
 *
 * 如果你发现程序中的漏洞或者笔误，可通过QQ向我反馈：960088610
 ***************************************************************************************/

#include "global.h"

// #define MPU6050_CALIBRATION
#ifndef MPU6050_CALIBRATION
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置NVIC为分组2 即抢占优先级范围：0~3，响应优先级范围：0~3
    usartDebug_init();
    RCC_APB2PeriphClockCmd(TEST_RCC, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = TEST_PIN_TRIGGER;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(TEST_PORT, &GPIO_InitStructure);

    i2c_init(); // i2c初始化
    printf("MPU6050 init start.\r\n");
    mpu6050_init(); // mpu6050初始化
    printf("MPU6050 init completed.\r\n");
    mpu6050_fliterInit(); // mpu6050滤波器初始化
    mpu6050_setBias(362, -27, 118, -125, 35, -8);
    imu_init(0.2f);  // imu初始化
    spi_init();      // spi初始化
    nrf24l01_init(); // nrf24l01初始化
    printf("NRF24L01 setRxMode start.\r\n");
    nrf24l01_setRxMode(); // 设置为接收模式
    printf("NRF24L01 setRxMode completed.\r\n");
    pwmMotor_init(); // 电机 pwm初始化
    pwmLED_init();   // led pwm初始化
    led_init();      // led初始化
    tim_init();      // 初始化定时器 5ms

    while (1)
    {
        printf("%d, %d, %d, %d, %d, %d, %d, %d\r\n",
               txRemote.roll, txRemote.pitch, txRemote.thr, txRemote.yaw,
               txRemote.aux1, txRemote.aux2, txRemote.aux3, txRemote.aux4);
        delay_ms(7);
    }
}
#else
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置NVIC为分组2 即抢占优先级范围：0~3，响应优先级范围：0~3
    usartDebug_init();
    RCC_APB2PeriphClockCmd(TEST_RCC, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = TEST_PIN_TRIGGER;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(TEST_PORT, &GPIO_InitStructure);

    i2c_init();
    printf("MPU6050 init start.\r\n");
    mpu6050_init();
    printf("MPU6050 init completed.\r\n");
    mpu6050_fliterInit();

    printf("Please put the MPU6050 on a flat surface. Calibration will start in 5 seconds...\r\n");
    delay_ms(5000);

    printf("MPU6050 calibration started.\r\n");

    while (1)
    {
        // 尝试校准
        if (mpu6050_calibrate() == SUCCESS)
        {
            // 打印温度
            mpu6050_getData_F();
            printf("MPU6050 Temp: %f\r\n",
                   mpu6050_F.temp);
            // 打印加速度计偏差
            printf("MPU6050 Bias (Acc): %d, %d, %d\r\n",
                   mpu6050.accBiasX, mpu6050.accBiasY, mpu6050.accBiasZ);
            // 打印陀螺仪偏差
            printf("MPU6050 Bias (Gyro): %d, %d, %d\r\n",
                   mpu6050.gyroBiasX, mpu6050.gyroBiasY, mpu6050.gyroBiasZ);
            // 打印所有偏差
            printf("MPU6050 Bias (All): %d, %d, %d, %d, %d, %d\r\n",
                   mpu6050.accBiasX, mpu6050.accBiasY, mpu6050.accBiasZ,
                   mpu6050.gyroBiasX, mpu6050.gyroBiasY, mpu6050.gyroBiasZ);
            printf("MPU6050 calibration completed successfully.\r\n");
        }
        else
        {
            printf("MPU6050 calibration failed.\r\n");
        }
    }
}
#endif
